-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Port] Cherry Pick Fixes #207
[Port] Cherry Pick Fixes #207
Conversation
* Make ghost roles collapsible * Save `BodyVisible` state of each `Collapsible` box * Make ghost role collapsible only when group has more than 1 role * Make it a little prettier * Make only ghost role buttons collapsible * Apply requested changes * Typo * Small cleanup * Store in list, instead of iterating * Make unique ids more unique * Move it out of the cycle * Make _collapsibleBoxes into dictionary and use key instead of Collapsible boxes names Added TODO. So after the problem will be fixed in `GhostRolesEui`, it should be mirrored and fixed here too. * Put TODO in GhostRolesEui. I guess Issue must be made for this * Use HashSet instead of Dictionary as suggested. Invert the HashSet, so being present means it uncollapsed I decided to invert HashSet to _uncollapsedStates, because players surely will have more collapsed buttons than opened, so we optimise memory usage a little bit. * Remove extra space from ghost roles window * Add buttons stretching. Size 3:1
more convenient cheeseem
Still isn't really suitable to just map but at least it doesn't outright NRE anymore. Alternative to #34032
Construction always grants a blank newline even if it not currently constructing.
Added a generic anchor visuals enum
Layout would break for machines with >6 lights because the column count was hardcoded. Uncap the UI width and fix the rows count instead. Lights with less than 4 characters of text weren't aligned right, now they are.
More device configurator invalid entity serialization fixes
* Fix for over-cuffing someone * comment
Actually inspect entity in hands
* fractional weights dont work in StationEvents * force-int * sure why not, we can keep floats I guess.
Fixed stores with multiple currencies having bad formatting and non-functional withdraw screens
Co-authored-by: Winkarst <[email protected]>
removed opsolete netmessage createor
The light itself should already turn off due to `LitOnPowered` component, but the broken state of a VendingMachine did not. Fixes #33382
* Fix disposals. * Rename properly --------- Co-authored-by: sleepyyapril <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>
Swap VowAlert and VowBrokenAlert on lines 149 and 150 so that the proper alerts are cleared and shown
* adjust min blindness back to 0 when PermanentBlindnessComponent is removed * mapinit changes * remove OnRemove, move changes to OnShutdown * goodbye event * dependency removal * final adjustment --------- Co-authored-by: lunarcomets <luanrcomets2@gmail,com>
vape small fix
* Fix reserach disk crash * remove extra whitespace * removed args.handled where args are not handled
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the ОбзорWalkthroughЭтот обзор представляет собой обширный набор изменений в клиентской, серверной и общей функциональности игры. Изменения охватывают различные системы, включая пользовательский интерфейс, сетевое взаимодействие, управление состоянием игры, системы призраков, хранения, и многие другие. Модификации включают обновления логики, улучшение визуальных эффектов, оптимизацию кода и добавление новых функций. Changes
Suggested labels
Suggested reviewers
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 5
🔭 Outside diff range comments (2)
Content.Client/SensorMonitoring/SensorMonitoringWindow.xaml.cs (2)
Line range hint
82-82
: Обнаружены критические TODO-комментарии требующие вниманияВ коде присутствуют несколько серьёзных проблем:
- Не поддерживается динамическое добавление сенсоров при открытом UI
- Не поддерживается динамическое добавление потоков при открытом UI
- Неоптимальное использование памяти из-за жёстко заданного размера массива вершин
Эти проблемы могут привести к некорректной работе интерфейса и проблемам с производительностью.
Хотите, чтобы я помог разработать решения для этих проблем? Я могу:
- Реализовать поддержку динамического добавления сенсоров и потоков
- Оптимизировать работу с массивом вершин используя динамическое выделение памяти
Also applies to: 87-87, 187-187
Line range hint
186-219
: Рекомендации по оптимизации производительности GraphViewТекущая реализация отрисовки графика имеет несколько проблем с производительностью:
- Неэффективное использование памяти из-за фиксированного размера массива
- Отсутствие повторного использования буфера вершин
- Отсутствие проверки границ при заполнении массива вершин
Предлагаю следующие улучшения:
private sealed class GraphView : Control { private readonly Queue<SensorSample> _samples; private readonly TimeSpan _startTime; private readonly TimeSpan _curTime; private readonly float _maxY; + private List<Vector2> _vertices; public GraphView(Queue<SensorSample> samples, TimeSpan startTime, TimeSpan curTime, float maxY) { _samples = samples; _startTime = startTime; _curTime = curTime; _maxY = maxY; + _vertices = new List<Vector2>(samples.Count * 6); RectClipContent = true; } protected override void Draw(DrawingHandleScreen handle) { base.Draw(handle); var window = (float)(_curTime - _startTime).TotalSeconds; - var vertices = new Vector2[25000]; - var countVtx = 0; + _vertices.Clear(); var lastPoint = new Vector2(float.NaN, float.NaN); foreach (var (time, sample) in _samples) { // ... existing point calculation ... if (float.IsFinite(lastPoint.X)) { handle.DrawLine(lastPoint, newPoint, Color.White); - vertices[countVtx++] = lastPoint; - vertices[countVtx++] = lastPoint with { Y = PixelHeight }; - vertices[countVtx++] = newPoint; - vertices[countVtx++] = newPoint; - vertices[countVtx++] = lastPoint with { Y = PixelHeight }; - vertices[countVtx++] = newPoint with { Y = PixelHeight }; + _vertices.Add(lastPoint); + _vertices.Add(lastPoint with { Y = PixelHeight }); + _vertices.Add(newPoint); + _vertices.Add(newPoint); + _vertices.Add(lastPoint with { Y = PixelHeight }); + _vertices.Add(newPoint with { Y = PixelHeight }); } lastPoint = newPoint; } - handle.DrawPrimitives(DrawPrimitiveTopology.TriangleList, vertices.AsSpan(0, countVtx), Color.White.WithAlpha(0.1f)); + if (_vertices.Count > 0) + { + handle.DrawPrimitives(DrawPrimitiveTopology.TriangleList, CollectionsMarshal.AsSpan(_vertices), Color.White.WithAlpha(0.1f)); + } } }
🧹 Nitpick comments (28)
Content.Shared/Cuffs/SharedCuffableSystem.cs (1)
469-474
: Новая проверка корректно ограничивает максимальное количество наручников, но стоит уведомлять пользователя.Сейчас при возврате
false
не происходит никакого уведомления игроку о невозможности наложить дополнительные наручники. Хорошей практикой было бы добавить либо логирование, либо всплывающее сообщение, чтобы информировать игрока о причине отказа.Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml.cs (2)
14-15
: Установка заголовка и описания черезTitle.Text
иDescription.SetMessage
.Это стандартный подход в Robust UI, однако при дальнейшем развитии может понадобиться механизм локализации строк.
17-18
: Общая структура класса выглядит простой и удобочитаемой.Рекомендуется добавить XML-комментарии для класса и конструктора, чтобы описать назначение и сценарии использования.
Content.Server/ServerUpdates/ServerUpdateManager.cs (3)
15-21
: Уточните документацию для соответствия новым возможностям.
Убедитесь, что комментарии отражают обновленное поведение с учетом периодических перезапусков и упоминают настройки конфигурации.
95-95
: Автоматическая проверка при отключении последнего игрока.
Логика полезна, но убедитесь, что в случае нестабильного соединения не произойдёт ложного триггера перезапуска.
147-149
: Инициализация журнала для отладки.
Метод PostInject корректно назначает канал логирования. Дополнительно можно добавить вывод стартового значения_uptimeRestart
для упрощения диагностики.Resources/Locale/ru-RU/ghost/ghost-gui.ftl (3)
8-9
: Информация о слышимости каналов.
Описания «вы снова слышите» и «теперь вы слышите» могут сбивать с толку. Убедитесь, что игрок понимает, в каком именно состоянии он находится и зачем происходит переключение.
30-31
: Кнопки запроса роли.
Добавлены варианты с таймером и без него. При локализации учитывайте, что «сек» кратко и понятнее, чем «секунд». Убедитесь, что затрагиваете единообразие во всех языковых файлах.
34-34
: Уведомление об отсутствии ролей.
Сообщение точно передаёт смысл. При наличии скрытых ролей могут ли игроки подумать, что «ролей нет»? Возможно, стоит уточнить, что отсутствуют «доступные» роли?Content.Shared/Traits/Assorted/Systems/PermanentBlindnessSystem.cs (1)
55-55
: Установка максимальной величины размытия зрения.
Похоже, чтоmaxMagnitudeInt
соответствуетBlurryVisionComponent.MaxMagnitude
. Уточните, действительно ли нужно устанавливать именно это значение для перманентной слепоты, или можно оставить поле зрения полностью закрытым.Content.Client/Light/HandheldLightSystem.cs (1)
32-38
: Статус активности не обрабатывается.Метод
TurnOn
аналогично всегда возвращаетtrue
, и комментарий предупреждает об отсутствии корректной предсказуемости. Если нужно отследить реальную возможность включения фонарика, следует добавить проверку текущего состояния и условия для успешного включения.Content.Client/Store/Ui/StoreWithdrawWindow.xaml.cs (1)
55-58
: Формирование текста кнопки.Запись
Loc.GetString(currency.Key.DisplayName, ("amount", currency.Value))
выводит название валюты и её количество. Убедитесь, что локализация поддерживает оба параметра без конфликтов.Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesWindow.xaml.cs (3)
18-20
: Хранение состояний раскрывающихся элементов.Коллекция
_collapsibleBoxes
и множество_uncollapsedStates
упрощают управление разворачивающимися блоками. Убедитесь, что при повторном открытии окна корректно восстанавливается состояние каждого блока.
57-59
: Подготовка списка ролей.Преобразование Enumerable в список позволяет заранее получить
rolesCount
. Убедитесь, что объём данных не слишком велик перед вызовомToList()
, чтобы избежать избыточного расхода памяти.
65-93
: Добавление нового компонента Collapsible при наличии нескольких ролей.При числе ролей больше одного создаётся
Collapsible
с заголовком, где используется локализованная строка. Отличная практика — выделять подобную логику в отдельный метод, если разрастётся.Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs (1)
112-115
: Удобная логика закрытия окна информации о правилахЕсли роль недоступна, окно закрывается автоматически. Это упрощает работу пользователя с интерфейсом. Убедитесь, что при обновлении
_windowRulesId
и закрытии окна не остаётся утечек ресурсов или подписок на ивенты.Content.Client/Store/Ui/StoreMenu.xaml.cs (1)
60-60
: Улучшенный формат отображения валюты с переносом строки.
Добавление символа новой строки после каждой записи в балансе улучшает читаемость отображаемой информации.Content.Server/Light/EntitySystems/HandheldLightSystem.cs (1)
Line range hint
194-212
: МетодTurnOn
теперь тоже переопределён и содержит проверку заряда.
Логика корректна: при недостаточном заряде выводится всплывающее сообщение. Рекомендуется добавить подробное логирование или телеметрию для упрощения диагностики жалоб на невозможность включения.Content.Shared/Construction/EntitySystems/AnchorableSystem.cs (1)
61-63
: ОбработчикOnAnchorStateChange
синхронизирует флагAnchored
.
Эта точка расширяет функционал, позволяя динамически обновлять внешний вид. Рекомендуется предусмотреть обработку, если сущность удалена или перемещена сразу после смены состояния.Content.Client/UserInterface/Systems/Hands/HandsUIController.cs (2)
91-91
: ОбработкаUIHandOpenContextMenu
: вызовargs.Handle()
.
Остановка дальнейшей цепочки событий корректна. Убедитесь, что каталог контекстных действий обновляется при динамических изменениях столкновений или блокировок рук.
101-101
: ОбработкаAltActivateItemInWorld
: вызовargs.Handle()
.
Отдельная обработка альтернативной активации повышает удобство. При необходимости проверьте назначение горячих клавиш в геймплее.Content.Server/VendingMachines/VendingMachineSystem.cs (1)
336-341
: Обновление визуальной подсветки в зависимости от состояния
Логика включения/выключения света при условии, что автомат не сломан и не обесточен, выглядит понятной и аккуратной. Тем не менее, обратите внимание на то, что для большого количества автоматов вызовы_light.SetEnabled
могут создавать нагрузку. Подумайте о дополнительной оптимизации, если в будущем планируется масштабное использование подобных эффектов.Content.Client/Wires/UI/WiresMenu.cs (2)
215-215
: Переход к строкам вместо столбцов
Изменение свойства наRows = 2
меняет структуру расположения элементов в контейнере. Убедитесь, что данная сетка подходит для всех желаемых статусов и корректно отображает элементы при изменении размера окна.
235-236
: Установка минимальных размеров окна
ПараметрыSetHeight = 200
иMinWidth = 320
упрощают фиксированный макет, но могут вызвать проблемы при локализации или изменении масштаба интерфейса. Рекомендуется проверить, не обрезаются ли элементы и текст при разных настройках UI.Resources/Prototypes/NPCs/mob.yml (1)
18-20
: ДобавленFollowCompound
в цепочку задач.Дополнительная задача расширяет возможности искусственного интеллекта, позволяя существам преследовать цель. Рекомендуется протестировать сценарии на всякий случай (например, если цель скрывается или игрок отменяет преследование). Убедитесь, что порядок задач в ветке сбалансирован и учтены условия прерывания.
Content.Shared/Storage/StorageComponent.cs (1)
74-79
: Улучшение контроля над активацией хранилищаСвойство
OpenOnActivate
предоставляет более гибкий контроль над открытием окна хранилища. Это хорошее улучшение, которое позволяет:
- Отключать автоматическое открытие при нажатии E
- Сохранять возможность открытия через глаголы
- Лучше контролировать поведение UI
Рекомендуется добавить событие для отслеживания случаев, когда окно не открывается из-за
OpenOnActivate = false
, чтобы другие системы могли реагировать соответствующим образом.Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml (2)
Line range hint
1-92
: Базовая конфигурация канистры требует дополнительной документацииРекомендуется добавить комментарии, объясняющие:
- Значения физических параметров (density: 190)
- Логику работы системы повреждений
- Причины выбора конкретных значений доступа
- type: Physics bodyType: Dynamic + # Density value chosen to match the weight of a filled industrial gas canister fixtures: fix1: shape: !type:PhysShapeAabb bounds: "-0.25,-0.25,0.25,0.25" density: 190
Line range hint
93-600
: Рекомендуется использовать константы для значений газовых смесейТекущие жестко закодированные значения (например, 1871.71051 молей) следует вынести в константы для улучшения поддержки и предотвращения ошибок при обновлении.
+ # В начале файла добавить: + const: + standardMoles: 1871.71051 # Стандартное количество молей для заполненной канистры + standardTemp: 293.15 # Стандартная температура (20°C) + liquidTemp: 72 # Температура для жидкого состояния gasMixture: volume: 1000 moles: - - 1871.71051 # oxygen + - !const standardMoles # oxygen temperature: !const standardTemp
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (45)
Content.Client/Eui/BaseEui.cs
(1 hunks)Content.Client/Inventory/StrippableBoundUserInterface.cs
(1 hunks)Content.Client/Light/HandheldLightSystem.cs
(1 hunks)Content.Client/SensorMonitoring/SensorMonitoringWindow.xaml.cs
(1 hunks)Content.Client/Store/Ui/StoreMenu.xaml.cs
(2 hunks)Content.Client/Store/Ui/StoreWithdrawWindow.xaml.cs
(4 hunks)Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs
(1 hunks)Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml
(1 hunks)Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml.cs
(1 hunks)Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml
(1 hunks)Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml
(1 hunks)Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml.cs
(1 hunks)Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml
(0 hunks)Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs
(1 hunks)Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesWindow.xaml.cs
(2 hunks)Content.Client/UserInterface/Systems/Hands/HandsUIController.cs
(1 hunks)Content.Client/Wires/UI/WiresMenu.cs
(3 hunks)Content.Server/Abilities/Mime/MimePowersSystem.cs
(1 hunks)Content.Server/Administration/Managers/AdminManager.cs
(1 hunks)Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs
(0 hunks)Content.Server/DeviceLinking/Systems/LogicGateSystem.cs
(1 hunks)Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs
(4 hunks)Content.Server/Light/EntitySystems/HandheldLightSystem.cs
(2 hunks)Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs
(1 hunks)Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs
(1 hunks)Content.Server/Projectiles/ProjectileSystem.cs
(1 hunks)Content.Server/Research/Disk/ResearchDiskSystem.cs
(1 hunks)Content.Server/ServerUpdates/ServerUpdateManager.cs
(4 hunks)Content.Server/StationEvents/EventManagerSystem.cs
(1 hunks)Content.Server/VendingMachines/VendingMachineSystem.cs
(2 hunks)Content.Shared/Atmos/Piping/Unary/Components/SharedGasPortableComponent.cs
(0 hunks)Content.Shared/CCVar/CCVars.cs
(1 hunks)Content.Shared/Construction/EntitySystems/AnchorableSystem.cs
(3 hunks)Content.Shared/Cuffs/SharedCuffableSystem.cs
(1 hunks)Content.Shared/Examine/ExamineSystemShared.cs
(1 hunks)Content.Shared/Light/SharedHandheldLightSystem.cs
(3 hunks)Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs
(2 hunks)Content.Shared/Storage/StorageComponent.cs
(1 hunks)Content.Shared/Traits/Assorted/Systems/PermanentBlindnessSystem.cs
(1 hunks)Resources/Locale/en-US/ghost/ghost-gui.ftl
(1 hunks)Resources/Locale/en-US/server-updates/server-updates.ftl
(1 hunks)Resources/Locale/ru-RU/ghost/ghost-gui.ftl
(1 hunks)Resources/Prototypes/Entities/Mobs/Species/slime.yml
(1 hunks)Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml
(1 hunks)Resources/Prototypes/NPCs/mob.yml
(1 hunks)
💤 Files with no reviewable changes (3)
- Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs
- Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml
- Content.Shared/Atmos/Piping/Unary/Components/SharedGasPortableComponent.cs
✅ Files skipped from review due to trivial changes (2)
- Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml
- Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml
🔇 Additional comments (79)
Content.Shared/CCVar/CCVars.cs (1)
35-49
: Добавленный параметр перезагрузки сервера выглядит полезным, но стоит проверить корректность в других местах.
Добавленная настройка ServerUptimeRestartMinutes
хорошо документирована и должна повысить управляемость сервером на долгих сессиях. Однако рекомендуется:
- Убедиться, что во всех механизмах перезагрузки учтены ситуации, когда игроки подключаются прямо перед срабатыванием таймера.
- Дополнительно добавить юнит-тест, если в проекте предусмотрены тестовые сценарии для
CCVars
, чтобы не допустить ошибок при чтении/записи значения или при неправильной интерпретации командой перезагрузки.
Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml (3)
2-3
: Отличная настройка контейнера
Установка Orientation="Horizontal"
и HorizontalAlignment="Stretch"
упрощает гибкое расположение кнопок по горизонтали.
8-9
: Убедитесь в желаемом соотношении для кнопки
Параметр SizeFlagsStretchRatio="3"
даст кнопке дополнительное пространство. Проверьте, соответствует ли это вашим дизайнерским ожиданиям.
14-14
: Последовательное применение горизонтального расширения
Добавление HorizontalExpand="True"
делает поведение второй кнопки единообразным с первой.
Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml.cs (4)
1-4
: Все пространства имён подключены корректно.
Нет замечаний по правильности и необходимости использования данных сборок.
5-7
: Правильно организованное пространство имён и атрибут [GenerateTypedNameReferences]
.
Атрибут упрощает связывание контролов из XAML-файла, что повышает удобочитаемость и облегчает сопровождение.
8-9
: Корректное наследование от BoxContainer
.
Данный контейнер обычно используется для вертикальной или горизонтальной укладки элементов в интерфейсе, что хорошо подходит для подобных информационных блоков.
10-13
: Инициализация XAML и загрузка интерфейса выглядят корректно.
При использовании RobustXamlLoader.Load(this)
будьте уверены, что все требуемые элементы корректно описаны в связанной XAML-разметке, чтобы избежать неожиданного NullReferenceException
.
Если нужно, могу помочь проверить соответствие между кодом и XAML-файлом. Хотите, чтобы я подготовил скрипт для поиска определений XAML?
Content.Client/SensorMonitoring/SensorMonitoringWindow.xaml.cs (1)
31-31
: Важное исправление: добавлена инициализация зависимостей!
Добавленная строка IoCManager.InjectDependencies(this);
критически важна для корректной работы класса, так как без неё зависимости _gameTiming
и _loc
останутся неинициализированными (null). Это исправление предотвращает возникновение NullReferenceException при использовании окна мониторинга сенсоров.
Давайте проверим использование этого паттерна в других окнах:
✅ Verification successful
Подтверждено: использование InjectDependencies соответствует общепринятой практике!
Анализ результатов показывает, что вызов IoCManager.InjectDependencies(this)
широко используется в клиентской части кодовой базы, особенно в окнах пользовательского интерфейса. Это стандартный паттерн для инициализации зависимостей, помеченных атрибутом [Dependency]
.
Добавление этой строки в SensorMonitoringWindow.xaml.cs
полностью соответствует установленным практикам разработки в проекте.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Описание: Поиск других окон, использующих InjectDependencies
ast-grep --pattern 'class $_ : FancyWindow {
$$$
[Dependency] private readonly $_ $_ = default!;
$$$
}'
Length of output: 111
Script:
#!/bin/bash
# Поиск классов, наследующих Window или FancyWindow с зависимостями
rg -U "class.*(?:Window|FancyWindow).*\{[\s\S]*?\[Dependency\].*\n.*=.*default!" --type cs
# Поиск использования InjectDependencies
rg "IoCManager\.InjectDependencies\(this\)" --type cs
Length of output: 20989
Content.Server/ServerUpdates/ServerUpdateManager.cs (7)
29-39
: Отличное добавление зависимости и нового поля для фиксации времени работы.
Убедитесь, что _logManager
корректно используется для отладки, а _uptimeRestart
инициализируется и проверяется на граничные значения во избежание пустого или нулевого таймера.
44-48
: Подтвердите обработку изменения конфигурации.
Если администратор устанавливает ServerUptimeRestartMinutes
в 0 или отрицательное число, желательно добавить проверку или вывести предупреждение, чтобы избежать непредвиденной перезагрузки.
75-75
: Учёт перезапуска в RoundEnded.
Вызов ShouldShutdownDueToUptime()
корректен, но проверьте, не приведёт ли это к внезапному завершению без уведомления игроков, если _updateOnRoundEnd
и время сервера совпадают.
88-91
: Прерывание таймера перезапуска при подключении игрока.
Хорошая идея отменять перезагрузку при появлении новых игроков. Убедитесь, что это правильно работает при одновременном подключении нескольких игроков подряд.
104-104
: Запуск проверки перезапуска после получения обновления.
Правильное решение оповестить игроков и при отсутствии игроков запланировать перезапуск.
137-140
: Дополнительный контекст для причины отключения.
Использование разных строк локализации выглядит корректно, но убедитесь, что уведомление игрокам о плановом перезапуске достаточно понятно и своевременно.
142-146
: Проверка превышения заданного времени работы сервера.
При нулевом значении _uptimeRestart
перезапуск не будет запланирован, что логично. Убедитесь, что все вызовы ShouldShutdownDueToUptime()
последовательно учитывают разные часовые пояса и системное время на сервере.
Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs (2)
67-69
: Подписка на BeforeSaveEvent.
Новое событие позволяет корректно обрабатывать сохранение карты. Убедитесь, что при ручном сохранении и автосохранении всё работает одинаково.
522-524
: Снятие конфигуратора со старого списка устройств.
Убедитесь, что при быстром переключении между двумя списками не возникают коллизии, когда конфигуратор не успевает удалиться из предыдущего списка. Возможно, стоит добавить проверку на наличие в списке перед удалением.
Resources/Locale/en-US/server-updates/server-updates.ftl (1)
3-3
: Новая локализованная строка для плановой перезагрузки.
Отличное решение, чтобы пользователи понимали причину остановки сервера. Убедитесь, что перевод доступен для всех поддерживаемых языков, если необходимо.
Content.Client/Eui/BaseEui.cs (1)
58-58
: Изменён способ создания сетевого сообщения.
Прямое использование new MsgEuiMessage()
вместо фабрики может упростить код, но проверьте, не теряется ли оптимизация через повторное использование объектов в пуле.
Resources/Locale/en-US/ghost/ghost-gui.ftl (1)
16-16
: Добавлена кнопка с числом доступных ролей.
Сообщение "Available ({$rolesCount})"
улучшает удобство игроков. Убедитесь, что это количество актуально обновляется при появлении или исчезновении ролей.
Content.Server/Research/Disk/ResearchDiskSystem.cs (1)
34-34
: Важное уточнение о завершении обработки события.
Установка args.Handled = true
гарантирует, что дальнейшие системы не будут обрабатывать это событие. Убедитесь, что такое поведение действительно желательно и не прерывает дополнительные взаимодействия.
Resources/Locale/ru-RU/ghost/ghost-gui.ftl (8)
1-3
: Дополнение новых ключей локализации для призрачных действий.
Новые строки корректно отражают функционал возврата в тело, телепорта и списка ролей. Убедитесь, что при использовании переменной {$count}
число подставляется корректно.
4-6
: Назначения переключателей призрачных режимов.
Строки для переключения видимости, освещения и поля зрения призрака выглядят логичными. Проверьте, что тексты локализации совпадают с соответствующими действиями в интерфейсе.
11-13
: Набор строк для окна телепорта.
Локализация «Телепорт призрака» и кнопок выглядит корректно. Убедитесь, что {$name}
всегда содержит читаемое имя цели телепорта.
15-23
: Добавлены строки для окна призрачных ролей.
Здесь используется сложная форма множественного числа для {$players}
; убедитесь, что вся логика выбора формы отражена корректно в коде.
[approve]
24-29
: Сообщения о выходе из лотереи.
По аналогии с предыдущим блоком, убедитесь, что при выводе количества игроков корректно обрабатывается форма множественного числа.
32-33
: Кнопка для «следовать за ролью».
Текст выглядит понятно. Убедитесь, что логика «следования» корректна при клике на эту кнопку.
36-37
: Сообщение о воскресении.
Текст понятен и отражает суть. Убедитесь, что игроку даётся ясный выбор и контекст при возвращении в тело.
38-38
: Уточнение о возврате в раунд.
Зафиксировано действующим ключом локализации, всё в порядке. Просто проверьте, не дублирует ли эта строка смысл «Вернуться в тело».
Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml.cs (2)
13-13
: Объявление класса GhostRoleButtonsBox.
Переход от GhostRolesEntry
к GhostRoleButtonsBox
выглядит логичным. Именование адекватно отражает идею «контейнера с кнопками для ролей».
19-19
: Упрощённая логика конструктора.
Аргументы bool hasAccess, FormattedMessage? reason, IEnumerable<GhostRoleInfo> roles, SpriteSystem spriteSystem
кажутся уместными. Убедитесь, что при отсутствии доступа и наличии reason
все элементы интерфейса корректно отключены, а тултип отображается верно.
Content.Shared/Traits/Assorted/Systems/PermanentBlindnessSystem.cs (3)
36-42
: Обработка BlindableComponent при выключении компонента.
Добавлено использование TryComp
для проверки компонента. Это повышает надёжность кода, исключая потенциальные NRE. Если MinDamage
не равно 0, вызывается _blinding.SetMinDamage(...)
. Отлично, что код учитывает состояние перед удалением.
47-47
: Проверка наличия BlindableComponent при инициализации.
Снова используется TryComp
. Хорошая практика для избежания ошибок. Продолжайте соблюдать такой стиль во всех компонентах.
51-51
: Установка MinDamage по значению Blindness.
Если Blindness не равно 0, используется заданное значение. Подтвердите, что нет конфликтов с другими системами, которые тоже влияют на MinDamage
.
Content.Client/Store/Ui/StoreWithdrawWindow.xaml.cs (4)
21-21
: Изменено ключевое поле словаря.
Теперь _validCurrencies
использует CurrencyPrototype
в качестве ключа. Это упрощает доступ к характеристикам валюты, однако убедитесь, что операции с ключами прототипов производятся корректно и исключают дубликаты.
39-39
: Добавление валюты с прототипом в качестве ключа.
Убедитесь, что объект proto
корректно индексируется и соответствует ключу, чтобы избежать возможных расхождений при дальнейших обращениях к словарю.
50-51
: Пропуск валют, недоступных для вывода.
Логика фильтрации по свойству CanWithdraw
выглядит корректно. Убедитесь, что это поведение согласуется с другими частями приложения, где могут учитываться иные ограничения.
71-71
: Определение максимальной величины вывода.
Используется maxWithdrawAmount = _validCurrencies.Values.Max().Int()
. Такая логика корректна при условии, что словарь не пуст (ранее проверяется _validCurrencies.Count < 1
). Рекомендуется отслеживать ситуации, когда доступных валют может быть несколько с одинаковым максимумом.
Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesWindow.xaml.cs (7)
1-7
: Новые директивы using.
Подключение System.Linq
, Robust.Client.UserInterface.Controls
и Robust.Client.UserInterface.XAML
говорит о расширении функционала, включая работу с коллекциями и XAML. Это упрощает реализацию новых UI-компонентов.
21-24
: Загрузка интерфейса через RobustXamlLoader.
Вызов RobustXamlLoader.Load(this);
обеспечивает инициализацию элементов интерфейса из XAML. Убедитесь, что все элементы корректно объявлены и стилизованы в соответствующем XAML-файле.
30-31
: Очистка структуры _collapsibleBoxes
.
После удаления всех детей контейнера вызов _collapsibleBoxes.Clear();
устраняет возможные конфликты отображения. Это упрощает повторное наполнение, избегая остатков предыдущих состояний.
33-43
: Сохранение состояний разворачивающихся блоков.
Метод SaveCollapsibleBoxesStates()
последовательно проверяет, какие блоки открыты, и добавляет их в _uncollapsedStates
. Если планируется множество одновременно открытых элементов, следует проработать механизм ограничения или очистки списка.
45-50
: Восстановление состояний разворачивающихся блоков.
Метод RestoreCollapsibleBoxesStates()
корректно соотносит ключи и видимость. При существенных изменениях текстов или ключей блоков убедитесь, что логика не нарушается.
60-64
: Cоздание GhostRoleInfoBox и GhostRoleButtonsBox.
Экземпляры GhostRoleInfoBox
и GhostRoleButtonsBox
упрощают логику, разгружая общий класс окна. Подписки на события OnRoleRequestButtonClicked
и OnRoleFollow
выглядят корректно.
96-97
: Обработка единственной роли.
При наличии только одного элемента избегается дополнительный контейнер. Это упрощает интерфейс.
Content.Shared/Light/SharedHandheldLightSystem.cs (2)
28-28
: Подписка на событие GetVerbsEvent.
Теперь система реагирует на GetVerbsEvent<ActivationVerb>
, добавляя логику включения/выключения фонарика. Убедитесь, что это не конфликтует с серверными системами, где может быть аналогичная функциональность.
86-102
: Добавление метода AddToggleLightVerb.
Здесь создаётся новый ActivationVerb
для фонарика, используя логику в зависимости от состояния Activated
. Убедитесь, что при наличии других взаимодействий (например, перезарядки) не возникает конфликтов вербов.
Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs (3)
80-85
: Сохранение состояния раскрытых панелей выглядит удачным улучшением
Это изменение гарантирует, что при обновлении списка ролей состояние элементов интерфейса не сбрасывается и не раздражает пользователей повторным закрытием. Хорошая идея продолжать поддерживать такую же логику и при дальнейших изменениях интерфейса.
93-94
: TODO-комментарий указывает на незавершённую задачу
В коде отмечено, что role.Requirements
не работает корректно в качестве ключа для группировки. Рекомендуется решить эту проблему: либо использовать более подходящий ключ хеширования, либо реализовать дополнительную логику для сравнения требований.
98-109
: Группировка и проверка доступа к ролям выглядят аккуратно
Код корректно использует requirementsManager.CheckRoleRequirements()
для определения, есть ли у игрока доступ к роли, и добавляет пояснение через reason
. Хорошо, что логику вынесли в специализированный requirementsManager
.
Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs (1)
43-44
: Корректное воспроизведение звука после удаления сущности
Сохранение coordinates
до удаления сущности позволяет проигрывать звук по правильным координатам. Это избавляет от потенциальных проблем с позиционным аудио, когда uid
уже не существует.
Content.Server/Projectiles/ProjectileSystem.cs (1)
73-75
: Проверка скорости перед нанесением отдачи камеры является разумной
Ранее KickCamera()
мог вызываться с нулевым вектором, что приводило к лишним вычислениям или аномальному поведению. Теперь recoil корректно применяется только при наличии скорости.
Content.Server/DeviceLinking/Systems/LogicGateSystem.cs (1)
47-47
: Изменение состояния comp.StateB
на Low
при Momentary
Теперь кратковременный импульс сбрасывается в низкий уровень на следующем тике, что повышает предсказуемость работы логического элемента. Убедитесь, что это изменение согласуется с остальными логическими системами и не ломает комбинации сигналов.
Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs (1)
19-19
: Добавление модификатора virtual
улучшает расширяемость класса.
Это изменение позволяет наследникам переопределять функционал, что полезно для дальнейшей кастомизации поведения виджета чата.
Content.Server/StationEvents/EventManagerSystem.cs (1)
77-90
: Перевод расчёта веса на float
и использование _random.NextFloat
повышает точность выбора события.
Благодаря таким изменениям вероятность запуска событий распределяется более гибко и корректно, что особенно полезно, если вес события нецелый. Убедитесь, что использование чисел с плавающей точкой не приведёт к непредвиденным эффектам при малых или больших значениях веса.
Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs (1)
127-127
: Добавление проверки args.Cancelled
даёт возможность прервать операцию.
Это предотвращает избыточные действия, если событие было отменено пользователем или системой, повышая устойчивость и гибкость кода.
Content.Client/Store/Ui/StoreMenu.xaml.cs (1)
69-72
: Предварительный выход из цикла при нахождении подходящей валюты повышает эффективность.
Теперь, как только обнаруживается валюта, удовлетворяющая условию, дальнейший перебор прекращается, избегая лишних итераций.
Content.Client/Inventory/StrippableBoundUserInterface.cs (2)
190-193
: Улучшена интерактивность при осмотре объекта.
Эта логика удобна, поскольку позволяет быстро осматривать сущности. Убедитесь, что нет конфликтов с другими действиями в интерфейсе и что метод _examine.DoExamine()
корректно обрабатывает непредвиденные ситуации.
195-198
: Добавлена контекстная опция по правой кнопке мыши.
Открытие меню действий с помощью _ui.GetUIController<VerbMenuUIController>()
повышает удобство. Убедитесь, что такие действия доступны только для допустимых сущностей и постоянно синхронизированы с серверной логикой.
Content.Server/Light/EntitySystems/HandheldLightSystem.cs (1)
Line range hint 180-192
: Метод TurnOff
теперь переопределён и возвращает корректное значение.
Переопределение повышает согласованность с базовой системой. Запросите тесты, чтобы убедиться, что корпус фонарика безошибочно переходит в выключенное состояние при низком заряде.
Content.Shared/Construction/EntitySystems/AnchorableSystem.cs (4)
33-33
: Новая зависимость _appearance
для обновления визуального состояния.
Поддержка внешнего вида при анкеровании делает систему более наглядной. Убедитесь, что эта зависимость правильно инициализируется даже в тестовых окружениях.
52-54
: Добавлены события ComponentStartup
и AnchorStateChangedEvent
.
Подписка на события даёт точку входа для синхронизации внешнего вида. Рекомендуется проверить влияние на производительность при очень частых изменениях состояния.
56-60
: Обработчик OnAnchorStartup
устанавливает изначальное визуальное состояние.
Отдельная инициализация при запуске компонента упрощает сопровождение. Убедитесь, что состояние корректно отображается для уже анкерованных сущностей.
363-367
: Добавлен enum AnchorVisuals
с единственным значением Anchored
.
Перечисление кажется гибким для будущего расширения. Убедитесь, что оно используется единообразно во всех местах, где требуется визуальное обновление.
Content.Client/UserInterface/Systems/Hands/HandsUIController.cs (3)
86-86
: Обработка UseSecondary
: вызов args.Handle()
.
Обработчик позволяет предотвратить дальнейшее распространение события. Проверьте, чтобы подобная логика не конфликтовала с другими пользовательскими действиями на аналогичном входе.
96-96
: Обработка ActivateItemInWorld
: вызов args.Handle()
.
Логика актуальна, когда происходит взаимодействие предмета с миром. Имейте в виду возможные эффекты задержки и конвейерную отладку в будущем.
106-106
: Обработка ExamineEntity
: вызов args.Handle()
.
Позволяет осматривать объект в руках без мешающих событий. Рекомендуется проверить, не требуется ли дополнительная валидация при отсутствии целевой сущности.
Content.Server/VendingMachines/VendingMachineSystem.cs (1)
41-41
: Добавлена зависимость от SharedPointLightSystem
Данная зависимость выглядит корректной для управления точечным светом. Убедитесь, что система освещения не вызывает избыточных обращений к серверу, особенно когда несколько автоматов могут одновременно менять своё состояние.
Content.Shared/Examine/ExamineSystemShared.cs (1)
388-389
: Избежание добавления пустых групп в Parts
Проверка на то, является ли сообщение пустым, прежде чем добавлять _currentGroupPart
в список, помогает избежать лишнего шума в выводе Examine. Это улучшает читаемость.
Also applies to: 391-391
Content.Server/Administration/Managers/AdminManager.cs (2)
407-415
: Защита от неактуального статуса сессии
Вы добавили проверку if (session.Status != SessionStatus.InGame) return null;
, что позволяет избежать загрузки данных для игрока, который уже вышел. Данное решение повышает устойчивость к непредвиденным отключениям.
417-417
: Выделение логики загрузки прав администратора в отдельный метод
Метод LoadAdminDataCore
инкапсулирует основную логику и предоставляет более чистую структуру кода. Это облегчает дальнейшую поддержку и расширяемость функционала.
Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs (2)
347-347
: Уточнить логику при отключённом ClickInsert
.
В этой ветке условия мы проверяем !storageComp.ClickInsert
, и при отключённой вставке по клику метод сразу завершается. Это обеспечивает более точный контроль над взаимодействиями, однако стоит убедиться, что в остальных местах не осталось путаницы с этим флагом. Если требуется альтернативное поведение при выключенном ClickInsert
, лучше добавить дополнительную логику обработки.
365-365
: Контроль открытия хранилища по событию ActivateInWorld
.
Добавлен жёсткий фильтр: требуется, чтобы !args.Handled && args.Complex == true && storageComp.OpenOnActivate == true
. Данный подход надёжнее защищает от непреднамеренного открытия. Если предполагается возможность быстрого открытия без дополнительных условий, можно предусмотреть вариант обработчика без args.Complex
.
Resources/Prototypes/Entities/Mobs/Species/slime.yml (1)
19-19
: Изменение openOnActivate: false
.
Теперь этот вид слайма не будет автоматически открывать интерфейс хранения при активации. Совместно с проверкой OpenOnActivate
в SharedStorageSystem
гарантирует, что доступ к хранилищу будет строго под контролем других условий (клик, интерфейс из меню и т.п.). Это повышает гибкость настроек поведения.
Content.Server/Abilities/Mime/MimePowersSystem.cs (1)
145-146
: Упорядочение вызовов ClearAlert
и ShowAlert
при возобновлении обета.
Теперь при повторном принятии обета сначала убирается оповещение о нарушении, затем показывается оповещение о действующем обете. Это исправляет возможную путаницу в интерфейсе оповещений и даёт чёткие визуальные сигналы игроку. Логика выглядит согласованной с остальным кодом.
Content.Shared/Storage/StorageComponent.cs (1)
68-72
: Проверьте взаимодействие с существующим свойством QuickInsert
Новое свойство ClickInsert
дополняет существующее свойство QuickInsert
. Убедитесь, что:
- Нет конфликтов в логике между этими свойствами
- Документация точно описывает разницу между ними
- Оба свойства правильно обрабатываются в
SharedStorageSystem
Выполните следующий скрипт для проверки использования обоих свойств:
✅ Verification successful
Based on the search results, I can now provide a final response:
Взаимодействие между QuickInsert и ClickInsert реализовано корректно
Анализ кода показывает, что свойства QuickInsert
и ClickInsert
используются в разных сценариях:
QuickInsert
используется в методеAfterInteract
для подбора предметов с землиClickInsert
используется в методеOnInteractUsing
для вставки предметов из рук
Оба свойства:
- Имеют четкое разделение ответственности
- Правильно обрабатываются в
SharedStorageSystem
- Не конфликтуют друг с другом
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Описание: Поиск использования QuickInsert и ClickInsert в системах хранения
# Поиск использования обоих свойств
ast-grep --pattern 'class SharedStorageSystem {
$$$
$_($$$) {
$$$
$x.QuickInsert
$$$
}
$$$
}'
ast-grep --pattern 'class SharedStorageSystem {
$$$
$_($$$) {
$$$
$x.ClickInsert
$$$
}
$$$
}'
Length of output: 231
Script:
#!/bin/bash
# Let's try a different approach to find the usage of these properties
# Find all storage-related system files
fd "Storage.*System\.cs$"
# Search for QuickInsert usage
echo "=== QuickInsert Usage ==="
rg "QuickInsert" -A 2 -B 2
# Search for ClickInsert usage
echo "=== ClickInsert Usage ==="
rg "ClickInsert" -A 2 -B 2
# Find the SharedStorageSystem file to examine its content
echo "=== SharedStorageSystem Content ==="
fd "SharedStorageSystem.cs" --exec cat {}
Length of output: 59074
Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml (2)
Line range hint 601-755
: Реализация сломанных канистр соответствует требованиям
Конфигурация корректно определяет:
- Состояния спрайтов для каждого типа
- Механику утилизации
- Категории для меню спавна
Line range hint 19-31
: Проверьте согласованность изменений визуального состояния
Замена GasPortableVisuals.ConnectedState
на AnchorVisuals.Anchored
может повлиять на другие части кодовой базы, использующие старую систему визуализации.
✅ Verification successful
Изменение системы визуализации подтверждено безопасным
Анализ показывает, что:
- Старое перечисление
GasPortableVisuals.ConnectedState
полностью удалено из кодовой базы - Новое перечисление
AnchorVisuals.Anchored
является частью системыAnchorableSystem
, которая централизованно управляет визуализацией закрепленных объектов - Изменение согласуется с архитектурой системы, где
AnchorableSystem
отвечает за управление состоянием закрепления объектов и их визуальным отображением
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск использования старого перечисления GasPortableVisuals.ConnectedState
rg "GasPortableVisuals\.ConnectedState" -l
# Поиск других файлов, которые могут требовать аналогичных изменений
ast-grep --pattern 'enum.GasPortableVisuals.$_'
Length of output: 94
Script:
#!/bin/bash
# Search for any references to GasPortableVisuals
rg "GasPortableVisuals" -l
# Search for other YAML files that might contain similar enum definitions
fd -e yml -e yaml -x grep -l "GasPortableVisuals\|AnchorVisuals"
# Search for enum definitions in C# code
rg "enum\s+GasPortableVisuals" -l
rg "enum\s+AnchorVisuals" -l
Length of output: 301
Script:
#!/bin/bash
# Проверим содержимое AnchorableSystem.cs для понимания изменений в системе визуализации
cat "Content.Shared/Construction/EntitySystems/AnchorableSystem.cs"
# Поищем другие возможные использования визуальных состояний в файле gas_canisters.yml
cat "Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml"
Length of output: 34136
if (_restartTime != null) | ||
{ | ||
DoShutdown(); | ||
if (_restartTime < _gameTiming.RealTime) | ||
{ | ||
DoShutdown(); | ||
} | ||
} | ||
else | ||
{ | ||
if (ShouldShutdownDueToUptime()) | ||
{ | ||
ServerEmptyUpdateRestartCheck("uptime"); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Управление логикой перезапуска при истечении времени.
Проверьте возможное состояние гонки: если _restartTime
меняется после проверки _restartTime != null
и до фактического вызова DoShutdown()
. Также рассмотрите логику при одновременном срабатывании условия на _uptimeRestart
.
private void ServerEmptyUpdateRestartCheck(string reason) | ||
{ | ||
// Can't simple check the current connected player count since that doesn't update | ||
// before PlayerStatusChanged gets fired. | ||
// So in the disconnect handler we'd still see a single player otherwise. | ||
var playersOnline = _playerManager.Sessions.Any(p => p.Status != SessionStatus.Disconnected); | ||
if (playersOnline || !_updateOnRoundEnd) | ||
if (playersOnline || !(_updateOnRoundEnd || ShouldShutdownDueToUptime())) | ||
{ | ||
// Still somebody online. | ||
return; | ||
} | ||
|
||
if (_restartTime != null) | ||
{ | ||
// Do nothing because I guess we already have a timer running..? | ||
// Do nothing because we already have a timer running. | ||
return; | ||
} | ||
|
||
var restartDelay = TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.UpdateRestartDelay)); | ||
_restartTime = restartDelay + _gameTiming.RealTime; | ||
|
||
_sawmill.Debug("Started server-empty restart timer due to {Reason}", reason); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Проверка пуста ли карта и запуск таймера перезапуска.
Логика разумна, но убедитесь, что при наличии ботов или других неучтённых сессий (например, админских) условие не запускает перезапуск некорректно. Также стоит логировать причину рестарта более детально.
private void OnMapSave(BeforeSaveEvent ev) | ||
{ | ||
var enumerator = AllEntityQuery<NetworkConfiguratorComponent>(); | ||
while (enumerator.MoveNext(out var uid, out var conf)) | ||
{ | ||
if (CompOrNull<TransformComponent>(conf.ActiveDeviceList)?.MapUid != ev.Map) | ||
continue; | ||
|
||
// The linked device list is (probably) being saved. Make sure that the configurator is also being saved | ||
// (i.e., not in the hands of a mapper/ghost). In the future, map saving should raise a separate event | ||
// containing a set of all entities that are about to be saved, which would make checking this much easier. | ||
// This is a shitty bandaid, and will force close the UI during auto-saves. | ||
// TODO Map serialization refactor | ||
|
||
var xform = Transform(uid); | ||
if (xform.MapUid == ev.Map && IsSaveable(uid)) | ||
continue; | ||
|
||
_uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure); | ||
DebugTools.AssertNull(conf.ActiveDeviceList); | ||
} | ||
|
||
bool IsSaveable(EntityUid uid) | ||
{ | ||
while (uid.IsValid()) | ||
{ | ||
if (Prototype(uid)?.MapSavable == false) | ||
return false; | ||
uid = Transform(uid).ParentUid; | ||
} | ||
return true; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Обработка сохранения для NetworkConfiguratorComponent.
Метод OnMapSave
выполняет проверку, не сохранён ли сам конфигуратор. Однако рекомендуется добавить журналы или уведомления, поясняющие пользователю, что UI будет закрыт для предотвращения несогласованности. Также в будущем можно вынести подобный функционал в более гибкую систему событий сохранения.
/// <remarks> | ||
/// TODO: Not properly predicted yet. Don't call this function if you want a the actual return value! | ||
/// </remarks> | ||
public override bool TurnOff(Entity<HandheldLightComponent> ent, bool makeNoise = true) | ||
{ | ||
return true; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Возвращаемое значение всегда true.
Функция TurnOff
всегда возвращает true
, но комментарий указывает, что результат может быть ненадёжным. Если дальнейшая логика действительно требует реального статуса (успешно выключен или нет), стоит доработать эту часть, чтобы возвращать корректный результат, либо убрать часть кода, создающую путаницу.
public abstract bool TurnOff(Entity<HandheldLightComponent> ent, bool makeNoise = true); | ||
public abstract bool TurnOn(EntityUid user, Entity<HandheldLightComponent> uid); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Абстрактные методы для включения и выключения.
Методы TurnOff
и TurnOn
декларируются как абстрактные, что вынуждает потомков (клиентские и серверные системы) предоставлять собственную реализацию. Важно согласовать это с реальной бизнес-логикой по управлению фонариками.
хуйню коммит взял |
Описание PR
Всякие fixiki from wizden
Медиа
Список
Изменения